﻿using System;
using System.Collections.Generic;
using System.Text;

namespace CppIDE.Core
{

    /// <summary>
    /// Egy fordítási hibaüzenetet (lehet csak warning is) reprezentál.
    /// Annyival több a sima hibaüzenetnél, hogy társulhat hozzá forrásfájl
    /// és a sor száma.
    /// </summary>
    public class CompileError : Error
    {

        /// <summary>
        /// Konstruktor, létrehoz egy új példányt, hozzátársított hellyel.
        /// </summary>
        /// <param name="message">A hibaüzenet szövege</param>
        /// <param name="lineNumber">A hiba helye (a sor száma)</param>
        /// <param name="container">A hiba helye (a forrásfájl)</param>
        public CompileError(String message, int lineNumber, SourceFile container)
            : base(message)
        {
            LineNumber = lineNumber;
            Container = container;
        }

        /// <summary>
        /// Konstruktor, létrehoz egy új példányt, de nem társít a hibához helyet.
        /// </summary>
        public CompileError(String message)
            : base(message)
        {
            LineNumber = -1;
            Container = null;
        }

        /// <summary>
        /// Konstruktor, létrehoz egy új példányt, hozzátársított fájllal, de sorszám nélkül.
        /// </summary>
        /// <param name="message">A hibaüzenet szövege</param>
        /// <param name="container">A hiba helye (a forrásfájl)</param>
        public CompileError(String message, SourceFile container)
            : base(message)
        {
            LineNumber = -1;
            Container = container;
        }

        /// <summary>
        /// A sor száma (-1, ha nincs)
        /// </summary>
        private int lineNumber;

        /// <summary>
        /// A sor száma tulajdonság (-1, ha nincs)
        /// </summary>
        /// <value>A sor száma (-1, ha nincs)</value>
        public int LineNumber
        {
            get
            {
                return lineNumber;
            }
            protected set
            {
                lineNumber = value;
            }
        }

        /// <summary>
        /// A tartalmazó forrásfájl (null, ha nincs vagy ismeretlen)
        /// </summary>
        private SourceFile container;

        /// <summary>
        /// A tartalmazó forrásfájl tulajdonság (null, ha nincs vagy ismeretlen)
        /// </summary>
        /// <value>A hibát tartalmazó forrásfájl (null, ha nincs vagy ismeretlen)</value>
        public SourceFile Container
        {
            get
            {
                return container;
            }
            set
            {
                container = value;
            }
        }

        /// <summary>
        /// String-gé alakítás: ha van tartalmazó fájl, akkor annak a neve, ha van
        /// sorszám, akkor az zárójelben, végül a hibaüzenet szövege.
        /// </summary>
        /// <returns>Visszatér egy string reprezentációval</returns>
        public override string ToString()
        {
            if (container != null)
            {
                String result = container.Name;
                if (lineNumber != -1)
                {
                    result += " (" + lineNumber + ")";
                }
                return result + ": " + base.ToString();
            }
            else
            {
                return base.ToString();
            }
        }

    }

}
